/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.deployment.manager;

import br.com.deployment.entidade.humana.Pessoa;
import br.com.deployment.entidade.localidade.Endereco;
import br.com.deployment.message.Msg;
import br.com.deployment.servico.CidadeServico;
import br.com.deployment.servico.PessoaServico;
import br.com.deployment.util.Caracteres;
import br.com.deployment.utilitario.*;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;

/**
 *
 * @author elyjr
 */
@ManagedBean
@ViewScoped
public class ManagerPessoa implements Serializable {

    @EJB
    PessoaServico pessoaServico;
    @EJB
    CidadeServico cidadeServico;
    
    private Boolean controle;
    private Pessoa pessoa, pessoaaux, pessoaauxTrans;
    private List<Pessoa> listpessoaTrans;
    private List<Pessoa> listpessoa;
    private Endereco endereco;
    private String opc, variavel, nome;
    
    private boolean controleAdquirente, controleTransmitente;

    public ManagerPessoa() {
    }

    @PostConstruct
    public void init() {
        pessoa = new Pessoa();
        pessoaaux = new Pessoa();
        pessoaauxTrans = new Pessoa();
        endereco = new Endereco();
        listpessoaTrans = new ArrayList<Pessoa>();
        listpessoa = new ArrayList<Pessoa>();
        controleAdquirente = true;
        controleTransmitente = true;
        controle = true;
        
    }

    public void reinit() {
        pessoa = new Pessoa();
        endereco = new Endereco();
    }

    public void clear() {
        pessoaaux = new Pessoa();
        pessoa = new Pessoa();
    }

    public List<Pessoa> getListpessoa() {
        return listpessoa;
    }

    public void setListpessoa(List<Pessoa> listpessoa) {
        this.listpessoa = listpessoa;
    }

   
    public void salvar(){
        System.err.println("Salvando");
        
            if(controle){
                pessoa.setTipo(TipoPessoa.Fisica);
            }else{
                pessoa.setTipo(TipoPessoa.Juridica);
            }
                
           if (endereco.getCidade() != null) {
                endereco.setCidade(cidadeServico.find(endereco.getCidade().getCod_cidade()));
                endereco.setEstado(endereco.getCidade().getCod_estado());
                pessoa.setEndereco(endereco);
            }
            endereco.setCelular(Caracteres.removecaracter(endereco.getCelular()));
            endereco.setTelefone(Caracteres.removecaracter(endereco.getTelefone()));
            endereco.setCep(Caracteres.removecaracter(endereco.getCep()));
            pessoa.setEndereco(endereco);
            pessoaServico.salvar(pessoa);
//            reinit();
    }

    public Pessoa selecionaPessoa() {
        System.out.println("slecPessoa");
        return pessoaaux;
    }

    public Pessoa selecionaPessoaTrans() {

        return pessoaauxTrans;
    }

    public void buscar() {
        
        if ((!"".equals(pessoa.getNome()) && pessoa.getNome() != null) || (pessoa.getCpf() != "" && pessoa.getCpf() != null) || (pessoa.getCnpj() != "" && pessoa.getCnpj() != null)) {
            pessoa.setTipo(controleAdquirente ? TipoPessoa.Fisica : TipoPessoa.Juridica);
            listpessoa = pessoaServico.findPessoa(pessoa, controleAdquirente ? TipoPessoa.Fisica : TipoPessoa.Juridica);
            pessoa = new Pessoa();
        } else {
            Msg.messagemError("Os campos 'Nome' ou 'Documentos' são requeridos");
        }
    }

    public void buscarTransmitente() {
        if ((!"".equals(pessoa.getNome()) && pessoa.getNome() != null) || (pessoa.getCpf() != "" && pessoa.getCpf() != null) || (pessoa.getCnpj() != "" && pessoa.getCnpj() != null)) {
            pessoa.setTipo(controleAdquirente ? TipoPessoa.Fisica : TipoPessoa.Juridica);
            listpessoaTrans = pessoaServico.findPessoa(pessoa, controleTransmitente ? TipoPessoa.Fisica : TipoPessoa.Juridica);
            pessoa = new Pessoa();
        } else {
            Msg.messagemError("Os campos 'Nome' ou 'Documentos' são requeridos");
        }
    }

    public List<Pessoa> completeImovel(String query) {
        List<Pessoa> suggestions = new ArrayList<Pessoa>();
        List<Pessoa> bd = new ArrayList<Pessoa>();

        Pessoa pessoaPesquisa = new Pessoa();

        if (opc.equalsIgnoreCase("nome")) {
            pessoaPesquisa.setNome(query);
        }
        if (opc.equalsIgnoreCase("cpf")) {
            pessoaPesquisa.setTipo(TipoPessoa.Fisica);
            pessoaPesquisa.setCpf(query);
        }
        if (opc.equalsIgnoreCase("cnpj")) {
            pessoaPesquisa.setTipo(TipoPessoa.Juridica);
            pessoaPesquisa.setCnpj(query);
        }
        if ((!"".equals(pessoaPesquisa.getNome()) || pessoaPesquisa.getNome() != null)
                && (!"".equals(pessoaPesquisa.getCpf()) || pessoaPesquisa.getCpf() != null)
                && (!"".equals(pessoaPesquisa.getCnpj()) || pessoaPesquisa.getCnpj() != null)) {

           // bd = pessoaDao.findPessoa(pessoaPesquisa, null);

            for (Pessoa p : bd) {
                if (p.getNome().startsWith(query)) {
                    suggestions.add(p);
                }
            }
        }
        return bd;
    }
    
    
     public List<Pessoa> autoComplete(String query) {
        List<Pessoa> suggestions = new ArrayList<Pessoa>();
        Pessoa pessoaPesquisa = new Pessoa();

        pessoaPesquisa.setNome(query);
        suggestions = pessoaServico.findPessoa(pessoaPesquisa, null);

        return suggestions;
    }
    
    
     public void redirect(String s) {
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            pessoa = new Pessoa();
            endereco = new Endereco();
            context.getExternalContext().redirect(s);
            System.err.println("REDIRECIONANDO PARA "+s);
        } catch (IOException ex) {
            Logger.getLogger(ManagerPessoa.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    public void pesquisarPessoa() {
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            reinit();
            pessoa = new Pessoa();
            endereco = new Endereco();
            pessoa.setEndereco(endereco);
            context.getExternalContext().redirect("/Cartorio-war/buscarPessoa.xhtml");
        } catch (IOException ex) {
            Logger.getLogger(br.com.deployment.manager.ManagerPessoa.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
 
    public void atribuiControleImovelAdquirente() {
        pessoa.setTipo(controleAdquirente ? TipoPessoa.Fisica : TipoPessoa.Juridica);
    }

    public void atribuiControleImovelTransmitente() {
        pessoa.setTipo(controleTransmitente ? TipoPessoa.Fisica : TipoPessoa.Juridica);
    }

    // get and set BOOLEAN Operadores Lógicos
    public boolean isControleAdquirente() {
        return controleAdquirente;
    }

    public void setControleAdquirente(boolean controleAdquirente) {
        this.controleAdquirente = controleAdquirente;
    }

    public boolean isControleTransmitente() {
        return controleTransmitente;
    }

    public void setControleTransmitente(boolean controleTransmitente) {
        this.controleTransmitente = controleTransmitente;
    }

    public Boolean getControle() {
        return controle;
    }

    public void setControle(Boolean controle) {
        this.controle = controle;
    }

    // get and set STRINGS Caracteres
    
    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getOpc() {
        return opc;
    }

    public void setOpc(String opc) {
        this.opc = opc;
    }

    public String getVariavel() {
        return variavel;
    }

    public void setVariavel(String variavel) {
        this.variavel = variavel;
    }
    // getter and setter OBJETO Pessoa
    
    public Pessoa getPessoaauxTrans() {
        return pessoaauxTrans;
    }

    public void setPessoaauxTrans(Pessoa pessoaauxTrans) {
        this.pessoaauxTrans = pessoaauxTrans;
    }

    public Pessoa getPessoaaux() {
        return pessoaaux;
    }

    public void setPessoaaux(Pessoa pessoaaux) {
        this.pessoaaux = pessoaaux;
    }

    public Pessoa getPessoa() {
        return pessoa;
    }

    public void setPessoa(Pessoa pessoa) {
        this.pessoa = pessoa;
    }

    // getter and setter List Pessoa
    public List<Pessoa> getListpessoaTrans() {
        return listpessoaTrans;
    }

    public void setListpessoaTrans(List<Pessoa> listpessoaTrans) {
        this.listpessoaTrans = listpessoaTrans;
    }

   
    // getter and setter OBJETO Endereco
    public Endereco getEndereco() {
        return endereco;
    }

    public void setEndereco(Endereco endereco) {
        this.endereco = endereco;
    }

    
    // Método Comum Roniere Rever
    public void atribuiOpc() {
        opc = opc;
    }

    
    
    // SelectItem de Utilitários
    
     
    public SelectItem[] selectItemSexo() {
        SelectItem[] items = new SelectItem[Sexo.values().length];
        int i = 0;
        for (Sexo sexo : Sexo.values()) {
            items[i++] = new SelectItem(sexo);
        }
        return items;
    }

    public SelectItem[] selectItemEstadoCivil() {
        SelectItem[] items = new SelectItem[EstadoCivil.values().length];
        int i = 0;
        for (EstadoCivil estadoCivil : EstadoCivil.values()) {
            items[i++] = new SelectItem(estadoCivil, estadoCivil.getNome());
        }
        return items;
    }

    public SelectItem[] selectItemTipoEndereco() {
        SelectItem[] items = new SelectItem[TipoEndereco.values().length];
        int i = 0;
        for (TipoEndereco tipo : TipoEndereco.values()) {
            items[i++] = new SelectItem(tipo);
        }
        return items;
    }

    public SelectItem[] selectItemTipoLogradouro() {
        SelectItem[] items = new SelectItem[TipoLogradouro.values().length];
        int i = 0;
        for (TipoLogradouro tipo : TipoLogradouro.values()) {
            items[i++] = new SelectItem(tipo, tipo.getNome());
        }
        return items;
    }
    
    
}
